#ifndef MUSIC_H
#define MUSIC_H


#include<QUrl>
#include<QMediaPlayer>
#include<QUuid>
#include <QSqlQuery>
#include <QSqlError>
#include<QCoreApplication>
class Music
{
public:
    Music()
    : isLike(false)
    , isHistory(false)
    {

    }
    Music(QUrl url)
    : isLike(false)
    , isHistory(false)
    , musicUrl(url)
    {
        // 读取url对应的歌曲文件的信息，解析出元数据
        // 歌曲名称、歌曲作者、歌曲专辑、歌曲持续时长
        musicId = QUuid::createUuid().toString();
        parseMediaMetaMusic();
    }
    void setMusicId(const QString& musicId)
    {
        this->musicId = musicId;
    }
    void setMusicName(const QString& musicName)
    {
        this->musicName = musicName;
    }
    void setMusicSinger(const QString& musicSinger)
    {
        this->musicSinger = musicSinger;
    }
    void setMusicAlbum(const QString& musicAlbumn)
    {
        this->musicAlbumn = musicAlbumn;
    }
    void setMusicDuration(qint64 duration)
    {
        this->duration = duration;
    }
    void setIsLike(bool isLike)
    {
        this->isLike = isLike;
    }
    void setIsHistory(bool isHistory)
    {
        this->isHistory = isHistory;
    }

    void setMusicUrl(QUrl musicUrl)
    {
        this->musicUrl = musicUrl;
    }

    QString getMusicName()
    {
        return musicName;
    }
    QString getMusicSinger()
    {
        return musicSinger;
    }
    QString getMusicAlbum()
    {
        return musicAlbumn;
    }
    qint64 getMusicDuration()
    {
        return duration;
    }
    bool getIsLike()
    {
        return isLike;
    }
    bool getIsHistory()
    {
        return isHistory;
    }
    QUrl getMusicUrl()
    {
        return musicUrl;
    }
    QString getMusicId()
    {
        return musicId;
    }

    QString getLrcFilePath()
    {
        // D:/musics/2002年的第一场学.mp3  歌曲文件路径
        // D:/musics/2022年的第一场学.lrc  歌词文件
        QString lrcPath = musicUrl.toLocalFile();
        lrcPath.replace(".mp3", ".lrc");    //获取歌曲歌词的文件路径
        lrcPath.replace(".flac", ".lrc");
        lrcPath.replace(".mpga", ".lrc");
        return lrcPath;
    }

    // 将歌曲属性写入到数据库
    //    void InsertMusicToDB();
    void insertMusicToDB()
    {
        // 1. 检测music是否在数据库中存在
        QSqlQuery query;
        // 当SELECT 1...查询到结果后，我们需要知道是否存在
        // SELECT EXISTS(⼦查询) ： ⼦查询中如果有记录，SELECT EXISTS返回TRUE
        // 如果⼦查询中没有满⾜条件的记录， SELECT EXISTS返回FALSE
        query.prepare("SELECT EXISTS (SELECT 1 FROM MusicInfo WHERE musicId = ?)");
        query.addBindValue(musicId);
        if(!query.exec())
        {
            qDebug()<<"查询失败: "<<query.lastError().text();
            return;
        }
        if(query.next())
        {
            bool isExists = query.value(0).toBool();
            if(isExists)
            {
                // musicId的歌曲已经存在
                // 2. 存在：不需要再插⼊musci对象，此时只需要将isLike和isHistory属性进⾏更新
                query.prepare("UPDATE MusicInfo SET isLike = ?, isHistory = ? WHERE musicId = ?");
                query.addBindValue(isLike? 1 : 0);
                query.addBindValue(isHistory? 1 : 0);
                query.addBindValue(musicId);
                if(!query.exec())
                {
                    qDebug()<<"更新失败: "<<query.lastError().text();
                }
                qDebug()<<"更新music信息: "<<musicName<<" "<<musicId;
            }
            else
            {
                // 3. 不存在：直接将music的属性信息插⼊数据库
                query.prepare("INSERT INTO MusicInfo(musicId, musicName,musicSinger, albumName, musicUrl,\duration, isLike, isHistory)\VALUES(?,?,?,?,?,?,?,?)");
                query.addBindValue(musicId);
                query.addBindValue(musicName);
                query.addBindValue(musicSinger);
                query.addBindValue(musicAlbumn);
                query.addBindValue(musicUrl.toLocalFile());
                query.addBindValue(duration);
                query.addBindValue(isLike ? 1 : 0);
                query.addBindValue(isHistory? 1 : 0);
                if(!query.exec())
                {
                    qDebug()<<"插⼊失败: "<<query.lastError().text();
                    return;
                }
                qDebug()<<"插⼊music信息: "<<musicName<<" "<<musicId;
            }
        }
    }
private:
    void parseMediaMetaMusic()
    {
        // 1. 创建媒体播放对象
        QMediaPlayer player;

        // 2. 设置媒体源，依靠setMedia方法解析元数据
        player.setMedia(musicUrl);

        // 3. 因为setMedia不会等待音乐的加载就立马返回
        //    因此在通过mediaMeta方法获取元数据时，需要保证媒体已经添加完毕
        //    可以通过isMetaDataAvailable检测数据是否有效
        //    如果该方法返回true，说明加载完成
        while(!player.isMetaDataAvailable())
        {
            QCoreApplication::processEvents();
        }

        // 已经加载完成，可以获取有效的元数据
        if(player.isMetaDataAvailable())
        {
            musicName = player.metaData("Title").toString();
            musicSinger = player.metaData("Author").toString();
            musicAlbumn = player.metaData("AlbumTitle").toString();
            duration = player.metaData("Duration").toLongLong();

            QString fileName = musicUrl.fileName();
            // 找-的位置
            int index = fileName.indexOf('-');

            // musicName为""的处理
            if(musicName.isEmpty())
            {
                if(index != -1)
                {
                    // "2002年的第一场雪 - 刀郎.mp3"
                    musicName = fileName.mid(0, index).trimmed();
                }
                else
                {
                    // "2002年的第一场雪.mp3"
                    musicName = fileName.mid(0, fileName.indexOf('.')).trimmed();
                }
            }

            // 作者为空
            if(musicSinger.isEmpty())
            {
                if(index != -1)
                {
                    musicSinger = fileName.mid(index+1, fileName.indexOf('.')-index-1).trimmed();
                }
                else
                {
                    musicSinger = "未知歌手";
                }
            }

            // 专辑名为空
            if(musicAlbumn.isEmpty())
            {
                musicAlbumn = "未知专辑";
            }

            // "2002年的第一场雪 - 刀郎.mp3"
            qDebug()<<fileName<<musicSinger<<":"<<musicAlbumn<<":"<<duration;
        }
    }

private:
    // 为了保证歌曲的唯一性，需要给音乐添加id
    QString musicId;
    // 音乐名称
    QString musicName;
    // 音乐作者
    QString musicSinger;
    // 音乐专辑
    QString musicAlbumn;
    // 持续时长--long long   04:30.56--->(4*60+30)*1000+56毫秒=270*1000+56毫秒=270056毫秒
    qint64 duration;
    // 是否收藏(是否喜欢)
    bool isLike;

    // 是否为历史播放
    bool isHistory;

    // 音乐QUrl
    QUrl musicUrl;
};

#endif // MUSIC_H
